package controller;

import java.util.List;

import model.KlsEstadoPedido;
import model.KlsPedido;
import model.KlsUsuario;


import org.hibernate.FetchMode;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import util.HibernateUtil;

public class KlsPedidoManager {
	
	
	public List<KlsPedido> listPorEstadoYZona(int piZona, int piEstado, int piCriterio)
	{
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        List<KlsPedido> pedidos = null;
        String squery = "";
        try {
        	
        	switch (piCriterio) {
        	
			case 1:
				//'Fecha de Entrega->Prioridad del Cliente->Valor del Pedido'
				squery = "from KlsPedido where klsEstadoPedido.idEstadoPedido = "+piEstado+ " and klsLocalidad.klsZonaEntrega.idZonaEntrega="+piZona;
				squery +=" order by fechaEntrega asc, klsCliente.proiridad desc, precioTotal desc  ";
				
				pedidos = (List<KlsPedido>) session.createQuery(squery).list();
				
				break;
				
			case 2:
				//'Fecha de Entrega->Valor del Pedido->Prioridad del Cliente'
				squery = "from KlsPedido where klsEstadoPedido.idEstadoPedido = "+piEstado+ " and klsLocalidad.klsZonaEntrega.idZonaEntrega="+piZona;
				squery +=" order by fechaEntrega asc,precioTotal desc, klsCliente.proiridad  desc ";
				
				pedidos = (List<KlsPedido>) session.createQuery(squery).list();
				
				break;
				
				
			case 3:
				//'Valor del Pedido->Fecha de Entrega->Prioridad del Cliente'
				squery = "from KlsPedido where klsEstadoPedido.idEstadoPedido = "+piEstado+ " and klsLocalidad.klsZonaEntrega.idZonaEntrega="+piZona;
				squery +=" order by precioTotal desc,fechaEntrega asc, klsCliente.proiridad desc ";
				
				pedidos = (List<KlsPedido>) session.createQuery(squery).list();
				
				
				break;
				
			case 4:
				//'Valor del Pedido->Prioridad del Cliente->Fecha de Entrega'
				squery = "from KlsPedido where klsEstadoPedido.idEstadoPedido = "+piEstado+ " and klsLocalidad.klsZonaEntrega.idZonaEntrega="+piZona;
				squery +=" order by precioTotal desc, klsCliente.proiridad desc, fechaEntrega asc  ";
				
				pedidos = (List<KlsPedido>) session.createQuery(squery).list();
				
				break;
				
			case 5:
				//'Prioridad del Cliente->Fecha de Entrega->Valor del Pedido',
				squery = "from KlsPedido where klsEstadoPedido.idEstadoPedido = "+piEstado+ " and klsLocalidad.klsZonaEntrega.idZonaEntrega="+piZona;
				squery +=" order by  klsCliente.proiridad desc, fechaEntrega asc , precioTotal desc ";
				
				pedidos = (List<KlsPedido>) session.createQuery(squery).list();
				
				break;
				
			case 6:
				//'Prioridad del Cliente->Valor del Pedido->Fecha de Entrega'
				squery = "from KlsPedido where klsEstadoPedido.idEstadoPedido = "+piEstado+ " and klsLocalidad.klsZonaEntrega.idZonaEntrega="+piZona;
				squery +=" order by  klsCliente.proiridad desc, precioTotal desc , fechaEntrega asc ";
				
				pedidos = (List<KlsPedido>) session.createQuery(squery).list();
				
				break;				
			default:
				break;
			}
        	
        	
  
             

        	 session.getTransaction().commit();      
             
             
             
        } 
        catch (HibernateException e) {
            e.printStackTrace();

            session.getTransaction().rollback();
        }
       
        return pedidos;
	}
	

	
	public List listPorEstado( int piEstado)
	{
		 List pedidos = null;
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        KlsEstadoPedido klsEstadoPedido = null;
        try {
             
         pedidos =  (List) session.createQuery("select p,c.nombre, c.proiridad from KlsPedidoViews p, KlsCliente c"+
        		 						" where p.idCliente = c.idCliente"+
        		 						" and p.idEstado = :estado")
        					.setParameter("estado", piEstado)
        					.list();

         session.getTransaction().commit();
        } 
        catch (HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
       
        return pedidos;
	}
	
		
	
    public KlsPedido update(KlsPedido pedido) {
    	Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.getTransaction().begin();
    	
    	try {
           	session.update(pedido);
           	session.getTransaction().commit();
    	}
        catch (HibernateException e) {
            e.printStackTrace();
            session.getTransaction().rollback();
        }
        
        return pedido;
    }
	
	
	
    public KlsPedido load(int idPedido) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        KlsPedido klsPedido = null;
       try{
        klsPedido = (KlsPedido) session.get(KlsPedido.class, idPedido); 
        session.getTransaction().commit();
       }
       catch(Exception e)
       {
    	   e.printStackTrace();
    	   session.getTransaction().rollback();
       }
        return klsPedido;
    }
    
    
}
